package com.zrrd.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

/**
 * @author WanJl
 * @version 1.0
 * @title SpringConfig
 * @description
 * @create 2024/1/26 9:38
 */
@Configuration  //设置当前的类为spring的配置类
//设置要在配置类中扫描所有@Component或其衍生注解(1、2、3)修饰的类，创建该类的对象，并把对象放入IOC容器中
@ComponentScan("com.zrrd.service")
//@PropertySource：加载类路径jdbc.properties文件
@PropertySource({"classpath:jdbc.properties"})
//注意：@PropertySource()中加载多文件请使用数组格式配置，不允许使用通配符*

//表示需要引入之前创建好的配置类，合并到Spring配置类中
@Import({JdbcConfig.class,MybatisConfig.class,SpringMvcConfig.class,SpringMvcSupport.class})

public class SpringConfig {
    /*
    约定大于配置
        spring框架启动后做的操作：
            1、扫描哪个类配置了@Configuration注解，那么就以当前的类作为Spring的核心配置类
            2、查看核心配置类中@Import()引入了哪些其他配置类，引入之后会执行第4步
            3、一并放到核心配置类中，作为启动前的项目配置。
            4、@PropertySource()注解加载项目的属性文件，比如：xxx.properties，将属性的值传入。
            5、执行@ComponentScan("包名")，把包里面所有用@Component以及其衍生注解修饰的类，创建对象，放入IOC容器


        spring整合mybatis的时候所做的操作：
            1、完成上面《spring框架启动后做的操作》。
            2、在上一步的时候，就已经将JdbcConfig里面的DataSource对象传入到IOC容器中。
            3、扫描MybatisConfig核心配置类，加入到spring核心配置类中
            4、在mybatis核心配置类中会进行以下操作：
                4.1 创建SqlSessionFactoryBean对象，用来生成SqlSessionFactory对象，
                4.2 然后通过配置数据源(数据源以及在第一步将DataSource对象传入到IOC容器中)
                4.3 还可以为实体类设置别名等操作（可选操作）。
                4.4 然后将SqlSessionFactoryBean对象交给IOC容器，由容器自己创建SqlSessionFactory对象

                4.5 然后通过MapperScannerConfigurer对象，扫描Mapper接口和Mapper配置文件，并创建Mapper的代理对象，并放入到IOC容器中
                4.6 最终将Mapper接口和Mapper配置文件产生的Mapper代理对象交给SpringIOC容器进行创建和管理
                4.5 由于MapperScannerConfigurer对象和SqlSessionFactoryBean对象都属于第三方提供的，
                我们需要使用@Bean注解，将创建好的对象放入SpringIOC容器，方便后续使用。

        6、开始业务操作...执行调用的方法...


     */
}
